package com.code.test.first.array;

public class Code209 {
    /**
     * https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.md
     * <p>
     * 给定一个含有 n 个正整数的数组和一个正整数 s ，找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组，并返回其长度。如果不存在符合条件的子数组，返回 0。
     * <p>
     * 示例：
     * <p>
     * 输入：s = 7, nums = [2,3,1,2,4,3]
     * 输出：2
     * 解释：子数组 [4,3] 是该条件下的长度最小的子数组。
     * 提示：
     * <p>
     * 1 <= target <= 10^9
     * 1 <= nums.length <= 10^5
     * 1 <= nums[i] <= 10^5
     */

    public static void main(String[] args) {
        int[] arr = {2, 3, 1, 2, 4, 3};
        int target = 7;
        int len = minSubArrayLen(arr, target);
        System.out.println(len);


    }

    public static int minSubArrayLen2(int[] arr, int target) {
        int sum = arr[0];
        int result = Integer.MAX_VALUE;
        int i = 0, j = 0;

        while (true) {
            if (sum < target) {
                if (j >= arr.length - 1) {
                    break;
                }
                //如果窗口总和<target
                sum += arr[++j];
            } else {
                //如果窗口总和>=target
                result = Math.min(result, j - i + 1);
                sum -= arr[i];
                i++;
            }
        }

        return result;
    }

    public static int minSubArrayLen(int[] arr, int target) {
        int sum = arr[0];
        int result = Integer.MAX_VALUE;
        int left = 0, right = 0;

        for (; right < arr.length; right++) {
            sum += arr[right];
            while (sum > target) {
                result = Math.min(result, right - left + 1);
                sum -= arr[left];
                left++;
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}
